#include "ULUI_MenuList.h"

#define MENU_GAP	10

//===========ULUI_Menu==============
ULUI_Menu::ULUI_Menu()
{
	title.SetEncode(FONT_CODE_UTF8);	
}

void ULUI_Menu::SetID(int id)
{
	this->id = id;
}

int ULUI_Menu::GetID()
{
	return id;
}

bool ULUI_Menu::operator>(const ULUI_Menu &menu)
{
	return id > menu.id;
}

bool ULUI_Menu::operator<(const ULUI_Menu &menu)
{
	return id < menu.id;
}

bool ULUI_Menu::operator==(const ULUI_Menu &menu)
{
	return id == menu.id;
}

//==============ULUI_MenuList=============
ULUI_Menu invalidMenu;

ULUI_MenuList::ULUI_MenuList():vertical(true)
{
	invalidMenu.id = -1;
}

ULUI_MenuList::ULUI_MenuList(bool vertical):vertical(vertical)
{
	invalidMenu.id = -1;
}

void ULUI_MenuList::SetVertical(bool vertical)
{
	this->vertical = vertical;
}

void ULUI_MenuList::AddMenu(ULUI_Menu &newMenu)
{
	menuList.push_back(newMenu);
}

void ULUI_MenuList::DelMenu(int menuID)
{
	ULUI_Menu tmpMenu;

	tmpMenu.SetID(menuID);

	menuList.remove(tmpMenu);
}

void ULUI_MenuList::Reset()
{
	menuList.clear();
}

int ULUI_MenuList::GetMenuCount()
{
	return menuList.size();
}

void ULUI_MenuList::SetFirstMenuXY(VSDL_Point startXY)
{
	this->startXY = startXY;
}

void ULUI_MenuList::UpdateMenuList(int mouseX, int mouseY)
{
	for (iter = menuList.begin(); iter != menuList.end(); iter++){
		(*iter).SelectedCheck(mouseX, mouseY);	
	}
}

ULUI_Menu &ULUI_MenuList::GetMenu(int menuID)
{
	for (iter = menuList.begin(); iter != menuList.end(); iter++){
		if ((*iter).id == menuID){
			return *iter;
		}
	}

	return invalidMenu;
}

void ULUI_MenuList::Show(SDL_Surface *destSurf)
{
	int w, h;

	if (menuList.size() == 0){
		return ;
	}	

	currentXY = startXY;

	menuList.front().GetTitleSize(w, h);

	for (iter = menuList.begin(); iter != menuList.end(); iter++){
		(*iter).Blit(destSurf, currentXY);

		if (vertical){
			currentXY.y += h;
		}else{
			(*iter).GetTitleSize(w, h);
			currentXY.x += w + MENU_GAP;
		}
	}
}
